package com.yanftch.stopcoding.common.network

import com.yanftch.stopcoding.common.util.LogUtil
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import okhttp3.OkHttpClient
import okhttp3.Request
import java.io.IOException
import java.net.URL
import javax.imageio.ImageIO


class ImageLoader_imageIO_first {
    private val TAG = "debug_ImageLoader"

    private val client = OkHttpClient()

    // 挂起函数，优先使用 ImageIO 加载图片，失败则使用 OkHttp
    suspend fun loadImage(url: String): ImageResult? {
        return withContext(Dispatchers.IO) {
            try {
                // 先使用 ImageIO 加载图片
                loadImageWithImageIO(url) ?: run {
                    // 如果 ImageIO 失败，则尝试使用 OkHttp 加载图片
                    loadImageWithOkHttp(url)
                }
            } catch (e: IOException) {
                LogUtil.d(TAG, "loadImage error: $e")
                e.printStackTrace()
                null
            }
        }
    }

    // 使用 ImageIO 加载图片
    private fun loadImageWithImageIO(url: String): ImageResult? {
        return try {
            val image = ImageIO.read(URL(url))
            if (image != null) {
                ImageResult(image, url)  // 返回图片和原始 URL
            } else {
                null
            }
        } catch (e: IOException) {
            LogUtil.d(TAG, "loadImageWithImageIO error: $e")
            e.printStackTrace()
            null
        }
    }

    // 使用 OkHttp 加载图片
    private fun loadImageWithOkHttp(url: String): ImageResult? {
        return try {
            // 构建 OkHttp 请求
            val request = Request.Builder().url(url).build()

            // 执行 OkHttp 请求
            val response = client.newCall(request).execute()

            if (response.isSuccessful) {
                // 获取重定向后的 URL
                val realUrl = response.request.url.toString()

                // 尝试读取图片数据
                val image = response.body?.byteStream()?.use { inputStream ->
                    ImageIO.read(inputStream)
                }
                LogUtil.d(TAG, "loadImageWithOkHttp image===== $image")

                // 如果成功解析图片并有真实URL，返回结果
                if (image != null) {
                    ImageResult(image, realUrl)
                } else {
                    null
                }
            } else {
                LogUtil.d(TAG, "loadImageWithOkHttp response error: "+"Error: ${response.code} ${response.message}")
                null
            }
        } catch (e: IOException) {
            e.printStackTrace()
            LogUtil.d(TAG, "loadImageWithOkHttp error: $e")
            null
        }
    }
}

